package org.blade.personal.framework.orm;

/**
 * Type alias
 * @author ZGF
 *
 * @param <T>
 */
public interface TypeAlias<T> {

	
	/**
	 * 约定实例化方法
	 * @param name 属性名
	 * @param value 值
	 * @param table 表别名
	 * @return
	 */
//	public TypeAlias<T> newInstance(String name,T value, String table);
	
	
	
	/**
	 * 约定实例化方法
	 * @param name 属性名
	 * @param value 值
	 * @param table 表名
	 * @param tableAlise 表别名
	 * @return
	 */
//	public TypeAlias<T> newInstance(String name, T value, String table, String tableAlise, String javaType);
	
	/**
	 * Equal to  
	 * @param type
	 * @return
	 */
	public TypeAlias<T> eq(EntityAttribute<T> type);
	
	
	/**
	 * Equal to  
	 * @param type
	 * @return
	 */
	public TypeAlias<T> eq(Object type);
	
	/**
	 * Not equal to 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> notEq(EntityAttribute<T> val);
	
	
	/**
	 * Like 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> likeAll(EntityAttribute<String>  val);
	
	/**
	 * Like 
	 * @param type
	 * @return
	 */
	public TypeAlias<T> likeAll(String  val);
	
	/**
	 * Like start with 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> likeSw(EntityAttribute<String>  val);
	
	/**
	 * Like start with 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> likeSw(String  val);
	
	
	
	/**
	 * Like end with ,eg: like 'XXX%'
	 * @param val
	 * @return
	 */
	public TypeAlias<T> likeEw(EntityAttribute<String> val);
	
	/**
	 * Like end with ,eg: like 'XXX%'
	 * @param val
	 * @return
	 */
	public TypeAlias<T> likeEw(String val);	
	
	/**
	 * Not like  
	 * @param val 
	 * @return
	 */
	public TypeAlias<T> notLike(EntityAttribute<String>  val);
	
	
	/**
	 * Not like  
	 * @param val 条件
	 * @return
	 */
	public TypeAlias<T> notLike(String  val);
	
	
	/**
	 * less than 
	 * @param type
	 * @return
	 */
	public TypeAlias<T> lt(EntityAttribute<Number> val);
	
	
	/**
	 * less than 
	 * @param type
	 * @return
	 */
	public TypeAlias<T> lt(T val);
		
	/**
	 * great than 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> gt(EntityAttribute<Number> val);
	
	/**
	 * greate than 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> gt(T val);
	
	/**
	 * greate  or equal  
	 * @param val
	 * @return
	 */
	public TypeAlias<T> gtoeq(T val);
	
	/**
	 * greate or equal 
	 * @param val
	 * @return
	 */
	public TypeAlias<T> ltoeq(T val);
	
	
	
	/**
	 * as 
	 * @param type
	 * @return
	 */
	public TypeAlias<T> as(String type);
	
	
	/**
	 * and 
	 * @param experssion
	 * @return
	 */
	public TypeAlias<T> and(String experssion);
	
	/**
	 * and 
	 * @param type
	 * @return
	 */
	public TypeAlias<T> and(EntityAttribute type);
	
	
	/**
	 * and 
	 * @param experssion
	 * @return
	 */
	public TypeAlias<T> or(String experssion);
	
	/**
	 * and 
	 * @param type
	 * @return
	 */
	public TypeAlias<T> or(EntityAttribute type);
	
	/**
	 * max
	 * @return
	 */
	public TypeAlias<T> max();
	
	/**
	 * min
	 * @return
	 */
	public TypeAlias<T> min();
	
	
	/**
	 * desc
	 * @return
	 */
	public TypeAlias<T> desc();
	
	/**
	 * asc
	 * @return
	 */
	public TypeAlias<T> asc();

	
	/**
	 * Get clause
	 * @return
	 */
	public String getClause();
	
	/**
	 * 设置别名
	 * @param alise
	 */
	public TypeAlias<T>  setAlise(String alise);
	
	/**
	 * 获取 javaType 枚举
	 * @return
	 */
	public String getType();
	
	/**
	 * 获取表
	 * @return
	 */
	public String getTable();
	
	public TypeAlias<T> clone();
	
	public void setClause(String clause);
	
	
}
